//!导入所需模块
import axios, {
  type InternalAxiosRequestConfig, //内部请求配置类型（axios 提供）
  type AxiosError, //定义 axios 请求错误类型
  type AxiosRequestConfig, //axios 请求配置的标准类型
} from 'axios';

//!扩展配置项: 为 AxiosRequestConfig 增加 donNotShowLoading 字段，用于控制是否显示加载提示。
interface AxiosRequestConfigEx extends AxiosRequestConfig {
  donNotShowLoading?: boolean;
}

//!ResType: 通用返回格式，包含 code（状态码）、data（数据体）和 msg（消息）
export type ResType<T = unknown> = {
  code: string;
  data: T;
  msg: string;
};
//!PageDataType: 用于分页数据类型，例如：列表、分页信息
export type PageDataType<T> = {
  list: T[];
  pageNum: number;
  pageSize: number;
  total: number;
};
//!RolesType: 定义角色实体字段，例如 id、name、status 等
export type RolesType = {
  code: string;
  createTime?: string;
  id?: number;
  name: string;
  sort: number;
  status: number;
};
//!创建 Axios 实例
const instance = axios.create({
  baseURL: 'http://localhost:8989',
  timeout: 2000,
});
//!http request 请求拦截器----request.use: 请求前的拦截逻辑
instance.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    //设置请求头
    config.headers.set('Content-Type', 'application/json');
    if (config.method == 'post') {
      config.data = JSON.stringify(config.data);
    }
    return config;
  },
  //如果请求配置发生错误，将错误抛出
  (error: AxiosError) => {
    Promise.reject(error);
  },
);
//!http response 响应拦截器----response.use: 响应后的拦截逻辑
instance.interceptors.response.use(
  (response) => {
    //响应成功时做一些处理
    return response.status == 200 ? Promise.resolve(response) : Promise.reject(response);
  },
  (error) => {
    const { response } = error;
    errorHanld(response.status, response.info);
  },
);

//!封装失败状态码
const errorHanld = (status: number, info: string) => {
  switch (status) {
    case 400:
      console.log('语义有误');
      break;
    case 401:
      console.log('服务器认证');
      window.location.href = '/LogoinView'; //如果是401，可能是未授权，跳转到登录页面
      break;
    case 402:
      console.log('服务器拒绝访问');
      break;
    case 403:
      console.log('地址有误');
      break;
    case 500:
      console.log('服务器遇到意外');
      break;
    case 502:
      console.log('服务器无响应');
      break;
    default:
      console.log(info);
      break;
  }
};

//!封装实例请求服务
export const service = <T = unknown>(config: AxiosRequestConfigEx): Promise<ResType<T>> => {
  //instance.request: 使用 axios 的实例方法发送请求
  return instance
    .request<ResType<T>>(config)
    .then((response) => {
      return response.data; //response.data: 返回解析后的数据体
    })
    .catch((error) => {
      console.error(error);
      throw error;
    });
};

//!get请求获取数据 角色分页列表
interface GetRolesPageParams {
  pageNum: number;
  pageSize: number;
}
export const requestGetRolesPage = (params: GetRolesPageParams) => {
  return service<PageDataType<RolesType>>({
    method: 'GET',
    url: '/roles/page',
    params,
  });
  // return instance
  //   .request<ResType<PageDataType<RolesType>>>({
  //     method: 'GET', // 指定请求方法
  //     url: '/roles/page', // 请求的 URL
  //     params, // 查询参数,
  //   })
  //   .then((response) => {
  //     return response.data;
  //   })
  //   .catch((error) => {
  //     console.error(error);
  //   });
};
//调用requestGetRolesPage查询第一页角色，每页打印100条
// const requestGetRolesPageHandler = async () => {
//   const res = await requestGetRolesPage({ pageNum: 1, pageSize: 100 });
//   console.log(res);
// };
// requestGetRolesPageHandler();

//!post添加数据  角色的增加功能
export const addRole = (data: RolesType) => {
  return service({
    method: 'POST',
    url: '/roles',
    data,
  });
  // return instance
  //   .request<ResType<PageDataType<RolesType>>>({
  //     method: 'POST', // 指定请求方法
  //     url: '/roles', // 请求的 URL
  //     data, // 查询参数,
  //   })
  //   .then((response) => {
  //     return response.data;
  //   })
  //   .catch((error) => {
  //     console.error(error);
  //   });
};

//!put修改数据  角色的修改功能
export const editRole = (roleId: string, data: Partial<RolesType>) => {
  service({
    method: 'PUT',
    url: `/roles/${roleId}`,
    data,
  });
  // return instance
  //   .request<ResType>({
  //     method: 'PUT', // 指定请求方法
  //     url: `/roles/${roleId}`,
  //     data, // 查询参数,
  //   })
  //   .then((response) => {
  //     return response.data;
  //   })
  //   .catch((error) => {
  //     console.error(error);
  //   });
};

//!patch修改角色状态  角色的状态是否禁用
export const editRolesStatus = (roleId: string, status: number) => {
  return service({
    method: 'PATCH',
    url: `/roles/${roleId}/status`,
    params: { status },
  });
  // return instance
  //   .request<ResType>({
  //     method: 'PATCH',
  //     url: `/roles/${roleId}/status`,
  //     params: { status },
  //   })
  //   .then((response) => {
  //     return response.data;
  //   })
  //   .catch((error) => {
  //     console.error(error);
  //   });
};

//!delete删除角色
export const deRole = (id: string) => {
  service({
    method: 'DELETE',
    url: `/roles/${id}`,
  });
  // instance
  //   .request({
  //     method: 'DELETE',
  //     url: `/roles/${id}`,
  //   })
  //   .then((response) => {
  //     return response.data;
  //   })
  //   .catch((error) => {
  //     console.error(error);
  //   });
};
